/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file cm_native_type.h
 *
 * @brief 提供CertManager中的枚举变量、结构体定义、宏定义和错误码。
 *
 * @library libohcert_manager.so
 * @kit DeviceCertificateKit
 *
 * @include <device_certificate/certmanager/cm_native_type.h>
 * @syscap SystemCapability.Security.CertificateManager
 * @since 22
 */

/**
 * @addtogroup CertManagerType
 * @{
 *
 * @brief 定义CertManager类型的头文件，声明各种宏、枚举、数据结构、错误码等。
 *
 * @since 22
 */

#ifndef CM_NATIVE_TYPE_H
#define CM_NATIVE_TYPE_H

#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 证书链最大长度。
 * 
 * @since 22
 */
#define OH_CM_MAX_LEN_CERTIFICATE_CHAIN   24588

/**
 * @brief URI最大长度。
 * 
 * @since 22
 */
#define OH_CM_MAX_LEN_URI              256

/**
 * @brief 证书别名最大长度。
 * 
 * @since 22
 */
#define OH_CM_MAX_LEN_CERT_ALIAS       129

/**
 * @brief 证书类型最大长度。
 * 
 * @since 22
 */
#define OH_CM_MAX_LEN_TYPE_NAME       1025

/**
 * @brief 错误码。
 *
 * @since 22
 */
typedef enum {
    /**
     * 成功。
     */
    OH_CM_SUCCESS = 0,
    /**
     * 权限校验失败。
     */
    OH_CM_HAS_NO_PERMISSION = 201,
    /**
     * 设备不支持。
     */
    OH_CM_CAPABILITY_NOT_SUPPORTED = 801,
    /**
     * 内部错误。可能原因：1.IPC通讯失败。2.内存操作错误；3.文件操作错误。
     */
    OH_CM_INNER_FAILURE = 17500001,
    /**
     * 证书不存在。
     */
    OH_CM_NOT_FOUND = 17500002,
    /**
     * 密钥库格式无效或密钥库密码不正确。
     */
    OH_CM_INVALID_CERT_FORMAT = 17500003,
    /**
     * 证书或凭据数量达到上限。
     */
    OH_CM_MAX_CERT_COUNT_REACHED = 17500004,
    /**
     *  应用未经用户授权。
     */
    OH_CM_NO_AUTHORIZATION = 17500005,
    /**
     * 设备进入坚盾守护模式。
     */
    OH_CM_DEVICE_ENTER_ADVSECMODE = 17500007,
    /**
     * 不支持指定的证书存储路径。
     */
    OH_CM_STORE_PATH_NOT_SUPPORTED = 17500009,
    /**
     * USB证书凭据访问失败。
     */
    OH_CM_ACCESS_UKEY_SERVICE_FAILED = 17500010,
    /**
     * 参数校验失败，例如参数格式或参数范围无效。
     */
    OH_CM_PARAMETER_VALIDATION_FAILED = 17500011
} OH_CM_ErrorCode;

/**
 * @brief 证书凭据用途类型。
 *
 * @since 22
 */
typedef enum {
    /**
     * 默认用途，用于凭据签名用途。
     */
    OH_CM_CERT_PURPOSE_DEFAULT = 0,
    /**
     * 所有用途，用于查询凭据功能。
     */
    OH_CM_CERT_PURPOSE_ALL = 1,
    /**
     * 签名用途。
     */
    OH_CM_CERT_PURPOSE_SIGN = 2,
    /**
     *  加密用途。
     */
    OH_CM_CERT_PURPOSE_ENCRYPT = 3
} OH_CM_CertificatePurpose;

/**
 * @brief 定义存放数据的结构体类型。
 *
 * @since 22
 */
typedef struct {
    /**
     * 数据大小。
     */
    uint32_t size;
    /**
     * 指向数据内存的指针。
     */
    uint8_t *data;
} OH_CM_Blob;

/**
 * @brief 定义证书凭据详情的结构体类型。
 *
 * @since 22
 */
typedef struct {
    /**
     * 表示证书数据是否存在。
     */
    uint32_t isExist;
    /**
     * 表示凭据的类型，最大长度为8字节，数据包含终止符'\0'字符。
     */
    char type[OH_CM_MAX_LEN_TYPE_NAME];
    /**
     * 表示凭据的别名，最大长度为128字节，数据包含终止符'\0'字符。
     */
    char alias[OH_CM_MAX_LEN_CERT_ALIAS];
    /**
     * 表示凭据的唯一标识，最大长度为256字节，数据包含终止符'\0'字符。
     */
    char keyUri[OH_CM_MAX_LEN_URI];
    /**
     * 表示凭据中包含的证书个数。
     */
    uint32_t certNum;
    /**
     * 表示凭据中包含的秘钥个数。
     */
    uint32_t keyNum;
    /**
     * 表示凭据二进制数据，最大长度为20480字节。
     */
    OH_CM_Blob credData;
    /**
     * 表示证书凭据的用途。
     */
    OH_CM_CertificatePurpose certPurpose;
} OH_CM_Credential;

/**
 * @brief 定义证书凭据详情列表的结构体类型。
 *
 * @since 22
 */
typedef struct {
    /**
     * 表示证书凭据详情的个数。
     */
    uint32_t credentialCount;
    /**
     * 表示证书凭据详情列表。
     */
    OH_CM_Credential *credential;
} OH_CM_CredentialDetailList;

/**
 * @brief 定义USB证书凭据信息的结构体类型。
 *
 * @since 22
 */
typedef struct {
    /**
     * 表示证书凭据用途。
     */
    OH_CM_CertificatePurpose certPurpose;
} OH_CM_UkeyInfo;

#ifdef __cplusplus
}
#endif

/** @} */
#endif /* CM_NATIVE_TYPE_H */